package coml.allen.api.qos;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

import java.io.IOException;

/**
 * @author sesshomaru
 * @date 2020/11/14 18:25
 */
public class MyConsumer extends DefaultConsumer {

    private Channel channel;

    public MyConsumer(Channel channel){
        super(channel);
        this.channel = channel;
    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        System.err.println("------------ 自定义的 consumer ------------");
        System.err.println("consumerTag: " + consumerTag);
        System.err.println("envelope: " + envelope);
        System.err.println("properties: " + properties);
        System.err.println("body: " + new String(body));

        // ack    会送给Broker一个应答表示这个消息已经被消费了
        // long deliveryTag,  消息的tag
        // boolean multiple     时否批量签收  这个主要看QOS的设置channel.basicQos(0,1,true); 如果大于1就用true， 如果是 1 则使用false即可
        channel.basicAck(envelope.getDeliveryTag(), false);

        /**
         * 如果设置了手动签收但是没有ack 会是什么后果呢?
         * 假设发送了5条消息  同时qos设置了1 那就是说一次处理1条消息
         * 所以只会有一条消息进来，因为没有ack掉，broker就会认为你这条消息还没有消费完，默认rabbitmq的限流机制就打开了
         * 会导致后面的4条消息过不来
         */
    }
}
